package com.arman.osmdroidmapsforge; import android.content.Context; import android.location.LocationManager; import android.os.AsyncTask; import com.arman.osmdroidmapsforge.routing.GraphHopperRoadManager; import com.arman.osmdroidmapsforge.routing.RouteCalculator; import org.osmdroid.bonuspack.routing.Road; import org.osmdroid.bonuspack.routing.RoadManager; import org.osmdroid.util.BoundingBoxE6; import org.osmdroid.util.GeoPoint; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * Created by Arman on 2016-02-01. */ public class Helper { public static final int OSRM=0, GRAPHHOPPER_FASTEST=1, GRAPHHOPPER_BICYCLE=2, GRAPHHOPPER_PEDESTRIAN=3, GOOGLE_FASTEST=4; public interface AsyncTaskEventListener<Result>{ void onPreExecute(); void onPostExecute(Result result); } public static BoundingBoxE6 calculateBBox(List<GeoPoint> points) { double minLat = Double.MAX_VALUE; double minLng = Double.MAX_VALUE; double maxLat = Double.MIN_VALUE; double maxLng = Double.MIN_VALUE; for (GeoPoint geoPoint : points) { if (geoPoint.getLatitude() < minLat) minLat = geoPoint.getLatitude(); if (geoPoint.getLongitude() < minLng) minLng = geoPoint.getLongitude(); if (geoPoint.getLatitude() > maxLat) maxLat = geoPoint.getLatitude(); if (geoPoint.getLongitude() > maxLng) maxLng = geoPoint.getLongitude(); } return new BoundingBoxE6(maxLat, maxLng, minLat, minLng); } public static Road getRoutingRoad(Context context, RouteCalculator routeCalculator, int whichRouteProvider, ArrayList<GeoPoint> waypoints) { RoadManager roadManager = null; Locale locale = new Locale("fa", "IR"); switch (whichRouteProvider) { case OSRM: // roadManager = new OSRMRoadManager(); break; case GRAPHHOPPER_FASTEST: roadManager = new GraphHopperRoadManager(context); ((GraphHopperRoadManager)roadManager).mRouteCalculator = routeCalculator; roadManager.addRequestOption("locale=" + locale.getLanguage()); break; case GRAPHHOPPER_BICYCLE: roadManager = new GraphHopperRoadManager(context); ((GraphHopperRoadManager)roadManager).mRouteCalculator = routeCalculator; roadManager.addRequestOption("locale=" + locale.getLanguage()); roadManager.addRequestOption("vehicle=bike"); //((GraphHopperRoadManager)roadManager).setElevation(true); break; case GRAPHHOPPER_PEDESTRIAN: roadManager = new GraphHopperRoadManager(context); ((GraphHopperRoadManager)roadManager).mRouteCalculator = routeCalculator; roadManager.addRequestOption("locale=" + locale.getLanguage()); roadManager.addRequestOption("vehicle=foot"); //((GraphHopperRoadManager)roadManager).setElevation(true); break; case GOOGLE_FASTEST: // roadManager = new GoogleRoadManager(); break; default: return null; } return roadManager.getRoad(waypoints); } public static class GetRoadAsync extends AsyncTask<Object, Integer, Road> { AsyncTaskEventListener<Road> mAsyncTaskEventListener; public GetRoadAsync(AsyncTaskEventListener<Road> asyncTaskEventListener) { this.mAsyncTaskEventListener = asyncTaskEventListener; } public GetRoadAsync() {} @Override public Road doInBackground(Object... params) { return getRoutingRoad((Context)params[0], (RouteCalculator)params[1], (Integer)params[2], (ArrayList<GeoPoint>)params[3]); } @Override public void onPostExecute(Road result) { if (mAsyncTaskEventListener != null) mAsyncTaskEventListener.onPostExecute(result); } @Override public void onPreExecute() { if (mAsyncTaskEventListener != null) mAsyncTaskEventListener.onPreExecute(); } } public static LocationManager locManager; public static android.location.Location getLastBestLocation(Context _context) { if (locManager == null) locManager = (LocationManager)_context.getSystemService(Context.LOCATION_SERVICE); int minDistance = (int) 500; long minTime = System.currentTimeMillis() - (900 * 1000); android.location.Location bestResult = null; float bestAccuracy = Float.MAX_VALUE; long bestTime = Long.MIN_VALUE; // Iterate through all the providers on the system, keeping // note of the most accurate result within the acceptable time limit. // If no result is found within maxTime, return the newest Location. List<String> matchingProviders = locManager.getAllProviders(); for (String provider: matchingProviders) { android.location.Location location = locManager.getLastKnownLocation(provider); if (location != null) { // log(TAG, " location: " + location.getLatitude() + "," + location.getLongitude() + "," + location.getAccuracy() + "," + location.getSpeed() + "m/s"); float accuracy = location.getAccuracy(); long time = location.getTime(); // log(TAG, "time>minTime: " + (time > minTime) + ", accuracy<bestAccuracy: " + (accuracy < bestAccuracy)); // if ((time > minTime && accuracy < bestAccuracy)) { if ( accuracy < bestAccuracy) { bestResult = location; bestAccuracy = accuracy; bestTime = time; } } } return bestResult; } }